package com.hpeu_01.day0126;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;

/**
 * 通过反射获取字段
 */
public class ReflectField {
    /**
     * Field对象中的方法：
     * 1. getName()：获取字段的名称，返回一个字符串
     * 2. getType()：获取字段类型，返回的是一个类型对象
     * 3. getDeclaringClass()：获取字段所属的类
     * 4. getAnnotation()：获取指定的注解
     * 5. getAnnotation(Class<?> classType)：获取字段上的指定注解类
     * 6. getAnnotatedType()：获取注解的类型
     * 7. getDeclaredAnnotations()：获取字段上所定义的所有注解类
     */
    @Test
    public void test04() throws Exception {
        Class<Person> clazz = Person.class;
        Person person = clazz.newInstance();
        /**
         * getDeclaredField(String fieldName)：获取本类中指定名称的字段
         */
        Field grade = clazz.getDeclaredField("grade");
        System.out.println(grade);
        grade.set(person,"大四");
        System.out.println(person);
    }

    @Test
    public void test03(){
        Class<Person> clazz = Person.class;
        /**
         * getDeclaredFields()：获取本类中所有的字段
         */
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
    @Test
    public void test02() throws Exception {
        Class<Person> clazz = Person.class;
        /**
         * clazz.getField(String name)：根据指定名称来获取字段，包括父类，只能获取公共的字段
         */
        Field birth = clazz.getField("birth");
        String name = birth.getName();//获取字段的名称，返回一个字符串
        System.out.println(name);

        Class<?> type = birth.getType();//获取字段类型，返回的是一个类型对象
        System.out.println(type);

        Class<?> declaringClass = birth.getDeclaringClass();//获取字段所属的类
        System.out.println(declaringClass);

        MyAnnotation annotation = birth.getAnnotation(MyAnnotation.class);//获取字段上的指定注解类
        System.out.println(annotation);
        System.out.println(annotation.value());

        AnnotatedType annotatedType = birth.getAnnotatedType();//获取注解的类型
        System.out.println(annotatedType);

        Annotation[] annotations = birth.getDeclaredAnnotations();//获取字段上所定义的所有注解类
        for (Annotation annotation1 : annotations) {
            System.out.println(annotation1);
        }
    }
    @Test
    public void test01(){
        Class<Person> clazz = Person.class;
        /**
         * clazz.getFields()：获取所有的公共字段，包括父类中的字段
         */
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}
